package com.swak.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Service;

import com.swak.utils.StringUtils;

/**
 * 注册服务
 *
 * @author: lifeng
 * @date: 2020/3/28 17:14
 */
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface FluxService {

	/**
	 * @return 实例化的名称
	 */
	@AliasFor(annotation = Service.class)
	String value() default StringUtils.EMPTY;

	/**
	 * @return 执行的模型@see Context
	 */
	Context context() default Context.Concurrent;

	/**
	 * 运行的线程模型：配合Context 一起使用<br>
	 * Context.IO min(def(定义的IO线程数, 核心数 * 2)， def(需要的并行度, 核心数))<br>
	 * Context.Order def(需要的并行度, 1)<br>
	 * Context.Concurrent def(需要的并行度, 核心数)<br>
	 * 
	 * @return 并行度
	 */
	int parallel() default -1;

	/**
	 * 自定义线程池的名称
	 * @return 可以设置在哪个 pool 中运行
	 */
	String pool() default StringUtils.EMPTY;

	/**
	 * 自定义线程池的数量， 首先得开启自定义线程池的名称
	 * @return 定义线程池的线程数
	 */
	int workers() default 1;
}